package com.cskaoyan.javase.oop1._1basic;

/**
 * @description: 重新认识引用数据类型
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 我们是通过数组认识引用数据类型的,我们知道引用数据类型分为两个部分:
 *      1.在栈上创建引用
 *      2.在堆上创建对象
 * 对象是引用数据类型的本质,而我们只能通过引用间接访问堆上的对象
 * 这样认识引用数据类型,会把基本数据类型和引用数据类型割裂开来,它们的定义是不统一的
 * 我们需要一种方式来统一它们的定义
 * 我们通过"数据类型"的定义来统一它们
 * 数据类型: 一组数据的集合,和基于它们的一组合法操作,称之为数据类型,比如int有固定的取值范围,并且它能做的操作也是固定的
 * 数据类型= 数据 + 操作
 * 引用数据类型 = 类 = 属性 + 行为
 * 类比: 类中定义的一组属性可以看成是一组数据,而基于这组数据的方法可以看成操作
 *
 *总结
 * - 一个类的定义，实际上就是定义了一种全新的数据类型，是一种自定义的数据类型
 * - 这种数据类型，和基本数据类型不同，它是我们自己自定义的数据类型（引用数据类型）
 *
 * 引用数据类型和基本数据类型的不同点:
 *      1.基本数据类型在很多书里也叫"内嵌类型",它表示这些类型是JVM在设计时就已经存在的类型
 *      这样JVM能够开辟基本数据类型变量所占的内存空间,并且存放数据
 *
 *      2.引用数据类型是自定义的数据类型,JVM在设计时是不可能知道有这个类型的,所以我们如果想要JVM创建它的对象,需要JVM先行"了解,认识"它,然后才能创建它的对象
 *      这个认识类型的过程,称之为"类加载"
 *      JVM通过类加载认识一个类型,类加载完毕后才能创建对象
 *
 * 类加载到底做什么?
 *      1.类加载的详细流程在后面的课程中会讲,这里我们简单了解即可
 *      2.类加载是通过I/O流读取一个类的二进制字节码文件到JVM的方法区中,随后经过一系列操作(加载--->连接--->初始化)完成类加载,类加载结束后,JVM就充分了解了该类型
 *
 * 几个问题:
 *      1.一个类的对象已经创建完毕了,那么类加载肯定进行了
 *          类加载的过程是先于创建对象的
 *      2.假如你在代码中创建了一个类的对象,那么程序运行到这行代码,会不会对它进行类加载?
 *          会,如果没有类加载就不能创建对象
 *          创建一个类的对象 --> 会触发一个类的类加载
 *
 */
public class Demo {
    public static void main(String[] args) {
        Person p = new Person();
        p.test();
    }
}
class Person{
    int age;
    String name;

    public void test(){
        System.out.println(age);
        System.out.println(name);
    }
}
